package com.scala.scalaFunction

object TestFunction {

    //可变长度参数
    def printStrs(i: Int, args:String*): Unit = {
        println("firstData"+i)
        var j:Int =0
        for(arg<-args){
            println("Arg values:"+j)
            j=j+1
        }
    }

    //高阶函数  可以将其他函数作为参数或者返回值
    def apply(f:Int=>String,v:Int):String={
        return f(v)
    }
    def layout[A](x:A)="["+x.toString()+"]"

    //匿名函数   左侧是参数列表 右侧是函数表达式
    var noname=(x:Int)=>x+1

    //偏应用函数  一种表达式，不需要提供函数需要的所有参数，只需要提供部分，或者不提供所需参数
   def log(info:String,message:String)={
        println(info+"******"+message)
    }

    //函数柯里化： 将原来接收两个参数的函数变成新的接受一个参数的函数过程；新的函数返回一个以原有第二个参数为参数的函数

    def add(x:Int,y:Int)=x+y
    def  addString(s1:String)(s2:String)={
        s1+s2
    }

    //闭包： 是一个函数，返回值依赖于声明在函数外部的一个或多个变量
    //闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数




    def main(args: Array[String]): Unit = {
      //  printStrs(22,"ceshi","kebiancashu")  可变参数
      //  println(apply(layout,20))  高阶函数
     //   println(noname(30))//匿名函数
    /*
     偏应用函数
     val logWith=log("it is",_:String)
        logWith("her")
        logWith("his")*/

       /* 柯里化
       println(add(2,3))
        println(addString("di yi ge")("di er ge"))*/


    }

}
